package org.example.rzfx.util;

import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;

/**
 * 文件读取工具类（支持断点续读）
 */
public class FileReaderUtil {
    
    /**
     * 从指定偏移量读取文件新增内容
     */
    public static List<String> readNewLines(String filePath, long lastOffset, Charset charset) throws IOException {
        List<String> lines = new ArrayList<>();
        
        try (RandomAccessFile file = new RandomAccessFile(filePath, "r")) {
            long fileLength = file.length();
            
            // 如果文件被清空或重新创建，从头开始读取
            if (lastOffset > fileLength) {
                lastOffset = 0;
            }
            
            // 定位到上次读取的位置
            file.seek(lastOffset);
            
            // 读取新增内容
            String line;
            byte[] buffer = new byte[8192];
            StringBuilder currentLine = new StringBuilder();
            
            int bytesRead;
            while ((bytesRead = file.read(buffer)) != -1) {
                String content = new String(buffer, 0, bytesRead, charset);
                
                for (char c : content.toCharArray()) {
                    if (c == '\n') {
                        if (currentLine.length() > 0) {
                            lines.add(currentLine.toString());
                            currentLine.setLength(0);
                        }
                    } else if (c != '\r') {
                        currentLine.append(c);
                    }
                }
            }
            
            // 最后一行（如果没有换行符）
            if (currentLine.length() > 0) {
                lines.add(currentLine.toString());
            }
        }
        
        return lines;
    }
    
    /**
     * 从指定偏移量读取文件新增内容（使用UTF-8编码）
     */
    public static List<String> readNewLines(String filePath, long lastOffset) throws IOException {
        return readNewLines(filePath, lastOffset, StandardCharsets.UTF_8);
    }
    
    /**
     * 获取当前文件大小
     */
    public static long getFileSize(String filePath) throws IOException {
        try (RandomAccessFile file = new RandomAccessFile(filePath, "r")) {
            return file.length();
        }
    }
}

